### 25.1 GIMPLE API

— GIMPLE function: tree gimple_simplify (enum tree_code, tree, tree, gimple_seq *, tree (*)(tree))
— GIMPLE function: tree gimple_simplify (enum tree_code, tree, tree, tree, gimple_seq *, tree (*)(tree))
— GIMPLE function: tree gimple_simplify (enum tree_code, tree, tree, tree, tree, gimple_seq *, tree (*)(tree))
— GIMPLE function: tree gimple_simplify (enum built_in_function, tree, tree, gimple_seq *, tree (*)(tree))
— GIMPLE function: tree gimple_simplify (enum built_in_function, tree, tree, tree, gimple_seq *, tree (*)(tree))
— GIMPLE function: tree gimple_simplify (enum built_in_function, tree, tree, tree, gimple_seq *, tree (*)(tree))

> The main GIMPLE API entry to the expression simplifications mimicing that of the GENERIC fold_{unary,binary,ternary} functions.

thus providing n-ary overloads for operation or function. The additional arguments are a gimple_seq where built statements are inserted on (if `NULL` then simplifications requiring new statements are not performed) and a valueization hook that can be used to tie simplifications to a SSA lattice.

In addition to those APIs `fold_stmt` is overloaded with a valueization hook:

— bool: fold_stmt (gimple_stmt_iterator *, tree (*)(tree));

Ontop of these a `fold_buildN`-like API for GIMPLE is introduced:

— GIMPLE function: tree gimple_build (gimple_seq *, location_t, enum tree_code, tree, tree, tree (*valueize) (tree) = NULL);
— GIMPLE function: tree gimple_build (gimple_seq *, location_t, enum tree_code, tree, tree, tree, tree (*valueize) (tree) = NULL);
— GIMPLE function: tree gimple_build (gimple_seq *, location_t, enum tree_code, tree, tree, tree, tree, tree (*valueize) (tree) = NULL);
— GIMPLE function: tree gimple_build (gimple_seq *, location_t, enum built_in_function, tree, tree, tree (*valueize) (tree) = NULL);
— GIMPLE function: tree gimple_build (gimple_seq *, location_t, enum built_in_function, tree, tree, tree, tree (*valueize) (tree) = NULL);
— GIMPLE function: tree gimple_convert (gimple_seq *, location_t, tree, tree);

which is supposed to replace `force_gimple_operand (fold_buildN (...), ...)` and calls to `fold_convert`. Overloads without the `location_t` argument exist. Built statements are inserted on the provided sequence and simplification is performed using the optional valueization hook.